package com.bfly.mall.order.dto;

import com.bfly.mall.order.enums.ExpressStatusEnum;
import com.bfly.mall.order.enums.OrderStatusEnum;
import com.bfly.mall.order.enums.PayStatusEnum;
import com.bfly.mall.product.enums.ProductActivityTypeEnum;
import com.bfly.mall.product.enums.ShippingMethodEnum;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * 订单列表DTO
 *
 * @author 长沙商脉科技有限公司
 * @date 2020/9/15 21:10
 */
public class OrderListDTO implements Serializable {


    private static final long serialVersionUID = -6476032861829640414L;
    private String orderNo;
    private Date createDate;
    private String consignee;
    private String phone;

    /**
     * 完整地址
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/10/5 20:24
     */
    private String address;

    private int orderStatus;
    private int payStatus;
    private int expressStatus;
    private int dispatchId;
    private int activityType;

    /**
     * 支付金额
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/10/5 20:26
     */
    private BigDecimal payPrice;

    private List<OrderSkuListDTO> skus;

    public String getActivityTypeName(){
        ProductActivityTypeEnum activityTypeEnum=ProductActivityTypeEnum.getActivityType(getActivityType());
        return activityTypeEnum==null?"":activityTypeEnum.getName();
    }

    public String getDispatchName() {
        ShippingMethodEnum dispatchEnum = ShippingMethodEnum.getShippingMethod(getDispatchId());
        return dispatchEnum == null ? "" : dispatchEnum.getName();
    }

    public String getOrderStatusName() {
        OrderStatusEnum status = OrderStatusEnum.getStatus(getOrderStatus());
        return status == null ? "" : status.getName();
    }

    public String getPayStatusName() {
        PayStatusEnum status = PayStatusEnum.getStatus(getPayStatus());
        return status == null ? "" : status.getName();
    }

    public String getExpressStatusName() {
        ExpressStatusEnum status = ExpressStatusEnum.getStatus(getExpressStatus());
        return status == null ? "" : status.getName();
    }

    /**
     * 是否能做支付操作
     * 顶大打开状态，物流初始状态，未支付状态的订单可做支付操作
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/5/11 12:06
     */
    public boolean isCanPay() {
        return getOrderStatus() == OrderStatusEnum.OPEN.getId() && getExpressStatus() == ExpressStatusEnum.INITIAL.getId() &&
                getPayStatus() == PayStatusEnum.WAIT_PAY.getId();
    }

    /**
     * 是否能做取消操作
     * 订单打开状态，物流初始状态，未支付状态的订单可以取消
     * 订单打开状态，物流待发货状态，支付成功状态的订单可以取消
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/4/25 14:11
     */
    public boolean isCanCancel() {
        return (getOrderStatus() == OrderStatusEnum.OPEN.getId() && getExpressStatus() == ExpressStatusEnum.INITIAL.getId() && getPayStatus() == PayStatusEnum.WAIT_PAY.getId()) ||
                (getOrderStatus() == OrderStatusEnum.OPEN.getId() && getExpressStatus() == ExpressStatusEnum.WAIT_SHIP.getId() && getPayStatus() == PayStatusEnum.SUCCESS.getId());
    }

    /**
     * 是否能做发货操作
     * 订单打开状态，物流待发货状态，已支付状态的订单可以做发货操作
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/4/25 14:14
     */
    public boolean isCanShip() {
        return getOrderStatus() == OrderStatusEnum.OPEN.getId() &&
                getPayStatus() == PayStatusEnum.SUCCESS.getId() &&
                getExpressStatus() == ExpressStatusEnum.WAIT_SHIP.getId();
    }

    /**
     * 用户是否能做申请退款操作
     * 订单打开状态，支付成功状态，待发货状态 可以申请退款
     * 订单打开状态，支付成功状态，已发货状态 可以申请退款
     * 订单完成状态，支付成功状态，已收货状态 可以申请退款
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/4/25 18:12
     */
    public boolean isCanApplyRefund() {
        return (getOrderStatus() == OrderStatusEnum.OPEN.getId() && getPayStatus() == PayStatusEnum.SUCCESS.getId() && getExpressStatus() == ExpressStatusEnum.WAIT_SHIP.getId()) ||
                (getOrderStatus() == OrderStatusEnum.OPEN.getId() && getPayStatus() == PayStatusEnum.SUCCESS.getId() && getExpressStatus() == ExpressStatusEnum.SHIPPING.getId()) ||
                (getOrderStatus() == OrderStatusEnum.COMPLETE.getId() && getPayStatus() == PayStatusEnum.SUCCESS.getId() && getExpressStatus() == ExpressStatusEnum.RECEIVED.getId());
    }

    /**
     * 门店是否能做退款确认操作
     * 订单打开状态，支付待退款状态，待发货状态 可以申请退款
     * 订单打开状态，支付待退款状态，已发货状态 可以申请退款
     * 订单完成状态，支付待退款状态，已收货状态 可以申请退款
     * 订单完成状态，支付待退款状态，商家已收货状态 可以申请退款
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/4/25 18:31
     */
    public boolean isCanRefund() {
        return (getOrderStatus() == OrderStatusEnum.OPEN.getId() && getPayStatus() == PayStatusEnum.WAIT_REFUND.getId() && getExpressStatus() == ExpressStatusEnum.WAIT_SHIP.getId()) ||
                (getOrderStatus() == OrderStatusEnum.OPEN.getId() && getPayStatus() == PayStatusEnum.WAIT_REFUND.getId() && getExpressStatus() == ExpressStatusEnum.SHIPPING.getId()) ||
                (getOrderStatus() == OrderStatusEnum.COMPLETE.getId() && getPayStatus() == PayStatusEnum.WAIT_REFUND.getId() && getExpressStatus() == ExpressStatusEnum.RECEIVED.getId()) ||
                (getOrderStatus() == OrderStatusEnum.COMPLETE.getId() && getPayStatus() == PayStatusEnum.WAIT_REFUND.getId() && getExpressStatus() == ExpressStatusEnum.RETURN_RECEIVED.getId());
    }

    /**
     * 门店是否能做驳回退款申请操作
     * 订单打开状态，支付待退款状态，待发货状态 可以驳回申请退款
     * 订单打开状态，支付待退款状态，已发货状态 可以驳回申请退款
     * 订单完成状态，支付待退款状态，已收货状态 可以驳回申请退款
     * 订单完成状态，支付待退款状态，商家已收货状态 可以驳回申请退款
     * 订单完成状态，支付待退款状态，商家待收货状态 可以驳回申请退款
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/4/25 18:55
     */
    public boolean isCanRejectRefund() {
        return isCanRefund() ||
                (getOrderStatus() == OrderStatusEnum.COMPLETE.getId() && getPayStatus() == PayStatusEnum.WAIT_REFUND.getId() && getExpressStatus() == ExpressStatusEnum.RETURN_WAIT_RECEIVE.getId());
    }

    /**
     * 订单是否能被商户已收货操作---退款退货
     *
     * @author 长沙商脉科技有限公司
     * @date 2020/4/25 19:57
     */
    public boolean isCanConfirmReceiveShopKeeper() {
        return getExpressStatus() == ExpressStatusEnum.RETURN_WAIT_RECEIVE.getId() &&
                getPayStatus() == PayStatusEnum.WAIT_REFUND.getId() &&
                getOrderStatus() == OrderStatusEnum.COMPLETE.getId();
    }

    /**
     * 订单是否可以做确认收货动作---用户手动确认或系统自动确认
     * @author 长沙商脉科技有限公司
     * @date 2020/12/4 18:07
     */
    public boolean isCanConfirmReceive(){
        return getExpressStatus() == ExpressStatusEnum.SHIPPING.getId() &&
                getPayStatus() == PayStatusEnum.SUCCESS.getId() &&
                getOrderStatus() == OrderStatusEnum.OPEN.getId();
    }

    public int getDispatchId() {
        return dispatchId;
    }

    public void setDispatchId(int dispatchId) {
        this.dispatchId = dispatchId;
    }

    public List<OrderSkuListDTO> getSkus() {
        return skus;
    }

    public void setSkus(List<OrderSkuListDTO> skus) {
        this.skus = skus;
    }

    public String getOrderNo() {
        return orderNo;
    }

    public void setOrderNo(String orderNo) {
        this.orderNo = orderNo;
    }

    public Date getCreateDate() {
        return createDate;
    }

    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }

    public String getConsignee() {
        return consignee;
    }

    public void setConsignee(String consignee) {
        this.consignee = consignee;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public int getOrderStatus() {
        return orderStatus;
    }

    public void setOrderStatus(int orderStatus) {
        this.orderStatus = orderStatus;
    }

    public int getPayStatus() {
        return payStatus;
    }

    public void setPayStatus(int payStatus) {
        this.payStatus = payStatus;
    }

    public int getExpressStatus() {
        return expressStatus;
    }

    public void setExpressStatus(int expressStatus) {
        this.expressStatus = expressStatus;
    }

    public BigDecimal getPayPrice() {
        return payPrice;
    }

    public void setPayPrice(BigDecimal payPrice) {
        this.payPrice = payPrice;
    }

    public int getActivityType() {
        return activityType;
    }

    public void setActivityType(int activityType) {
        this.activityType = activityType;
    }
}
